package apibasej.basic;

import java.io.File;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class MyStaticsTemp {

	
	
    public static void main(String[] args) throws Throwable {
    	/*
        // wmic command for diskdrive id: wmic DISKDRIVE GET SerialNumber
        // wmic command for cpu id : wmic cpu get ProcessorId
        Process process = Runtime.getRuntime().exec(new String[] { "wmic", "bios", "get", "serialnumber" });
        process.getOutputStream().close();
        Scanner sc = new Scanner(process.getInputStream());
        String property = sc.next();
        String serial = sc.next();
        System.out.println(property + ": " + serial);
        
    	
        byte[] macAddress;
        Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
        for (NetworkInterface netint : Collections.list(nets)){
        	System.out.println(">"+netint);
           macAddress = netint.getHardwareAddress();
           StringBuilder mac = new StringBuilder();
           if (macAddress != null){
              for (byte b : macAddress){
                 mac.append(String.format("%1$02X ", b));
              }
           }
           System.out.println(mac);
        }
        */
    	ArrayList<Integer> l = new ArrayList<>();
    	for(int i=0; i<10; i++){
    		l.add(i);
    	}
    	for(int i=0; i<100; i++){
        	System.out.println(getValorAleatorio(l));
    	}
    }
	
	public static byte[] getMAC() throws UnknownHostException, SocketException{
		InetAddress localHost = InetAddress.getLocalHost();
		NetworkInterface netInter = NetworkInterface.getByInetAddress(localHost);
		return netInter.getHardwareAddress();
	}
	public static String getMACStr() throws UnknownHostException, SocketException{
		byte[] macAddressBytes = getMAC();
		return  String.format("%1$02x-%2$02x-%3$02x-%4$02x-%5$02x-%6$02x", macAddressBytes[0], macAddressBytes[1], macAddressBytes[2], macAddressBytes[3], macAddressBytes[4], macAddressBytes[5]).toUpperCase();
	}
	
	
	
	
	public static void apagarTudo(File f){
		if(f.isDirectory()){ // tenta deletar os filhos primeiro
			for(File filho : f.listFiles()){
				apagarTudo(filho);
			}
		}
		boolean deletouTudo = f.delete();
		int tentativas = 3;
		while(!deletouTudo && f.exists() && --tentativas>0){ // tenta varias vezes deletar a pasta raiz até deletar tudo
			try {Thread.sleep(10);} catch (InterruptedException e) {}
			deletouTudo = f.delete();
			//if(--tentativas==0) throw new ProcEletrException("Não foi possível deletar os arquivos. Verifique se não existe nenhum documento aberto.","Não foi possível deletar os arquivos.\nVerifique se não existe nenhum documento aberto.",null);
		}
	}

	
	public static File getDirWorkspace(){
		ClassLoader cl = Thread.currentThread().getContextClassLoader();
		File p = new File(cl.getResource(".").getPath());
		while(!p.getName().startsWith("eclipseWorkspace")) p = p.getParentFile();
		return p;
	}
	
	// imprime o ResulSet em forma de tabela
	public static void printTab(ResultSet rs, int tamCol) throws SQLException{
		ResultSetMetaData rsmd = rs.getMetaData();
		System.out.print("0>\t");
		for(int i=1;  i<=rsmd.getColumnCount(); i++){
			System.out.print(compl(rsmd.getColumnName(i),tamCol));
		}
		System.out.println();
		for(int i=0;i<rsmd.getColumnCount()*(tamCol+1);i++) System.out.print("-");
		System.out.println();
		//*********************
		int ct = 1;
		while(rs.next()){
			System.out.print((ct++)+">\t");
			for(int i=1;  i<=rsmd.getColumnCount(); i++){
				System.out.print(compl(rs.getString(i),tamCol));
			}
			System.out.println();
		}
	}
	
	public static String compl(String s, int tam){
		if(s==null) s = "";
		while(s.length()<tam) s+=" ";
		return s+"|";
	}
	

	//**************** math ***********************************
	
	public static byte[] getRandomBytes(int qtd){
		List<Byte> list = new ArrayList<>();
		for(byte i=Byte.MIN_VALUE; i<Byte.MAX_VALUE; i++){
			list.add(i);
		}
		list.add(Byte.MAX_VALUE);//adiciona depois para não entrar em loop infinito, pois o i nunca vai ser maior que Byte.MAX_VALUE
		byte[] resp = new byte[qtd];
		for(int i=0; i<resp.length; i++){
			resp[i] = getValorAleatorio(list);
		}
		return resp;
	}
	
	public static <T> T getValorAleatorio(List<T> valores){
		if(valores==null){
			throw new NullPointerException("valores==null!");
		}
		if(valores.size()==0){
			throw new IllegalArgumentException("valores.size()==0!");
		}
		int qtdPartes = valores.size();
		double tamParte = 1D/(double)qtdPartes;
		double r = Math.random(); //r = 0.0;
		for(double i=0;i<qtdPartes;i++){
			// se o ramdom estiver atingido o valor correspondente a parte
			// verifica somente se o ramdom(posição do sorteio) está entre o valor da parte
			// o ramdom nunca será maior, pois sempre terá uma parte anterior que irá ter atingido o valor do ramdom e retornado
			// |A|B|C|D|E|F|G|H|
			if( r <= (i+1D)*tamParte ) {
				return valores.get((int)i); //valores[(int)i];
			}
		}
		throw new RuntimeException("RAMDOM BUG !!! ???"); // NUNCA DEVE CHEGAR AQUI !!!!
	}
	
	public static <T> List<T> embaralhar(List<T> valores){
		List<T> resp = new ArrayList<T>();
		while(valores.size()>0){
			T val = getValorAleatorio(valores); //T[] x = null; .toArray(x)
			resp.add( val );
			valores.remove( val );
		}
		return resp;
	}
	
	// baixo desempenho !
	public static String embaralhar(String s){
		StringBuilder resp = new StringBuilder();
		StringBuilder valores = new StringBuilder(s);
		while(valores.length()>0){
			int tam = valores.length();
			Integer[] opcoes = new Integer[tam];
			for(int i=0;i<tam;i++) opcoes[i] = i;			
			int iDel = getValorAleatorio( Arrays.asList(opcoes) );
			char c = valores.charAt(iDel);
			resp.append(c);
			valores.deleteCharAt(iDel);
		}
		return resp.toString();
	}
	
}
